package top.dingwen.io.treasure.api.auth;

import cn.hutool.core.util.ObjectUtil;
import lombok.Data;
import top.dingwen.io.treasure.api.base.constant.ApiConstant;
import top.dingwen.io.treasure.api.base.request.IBaseRequest;

import java.util.Map;
import java.util.Set;

/**
 * 认证用户请求对象
 *
 * @author dingwen
 * @since 2024/12/2 15:12
 */
@SuppressWarnings(ApiConstant.ALL)
@Data
public class AuthUserRequest implements IBaseRequest {
    /**
     * 参数
     */
    private Map<String, Object> params;

    /**
     * 账号
     * <p>此字段的含义与授权方式保持一致</p>
     */
    private Object account;

    /**
     * 密码密文
     */
    private String password;

    /**
     * 客户端编码
     */
    private String clientCode;


    /**
     * 租户编号
     */
    private Long tenantId;

    /**
     * 数据源键
     */
    private String tenantDataSourceKey;

    /**
     * 登录编号
     */
    private Long loginId;

    /**
     * 序列号
     */
    private String seqNumber;

    /**
     * 授权方式
     */
    private String grantMethod;

    /**
     * 账号是否过期
     */
    private Boolean accountNonExpired;

    /**
     * 账号是否锁定
     */
    private Boolean accountNonLocked;

    /**
     * 账号是否启用
     */
    private Boolean enabled;

    /**
     * 凭证(密码)是否过期
     */
    private Boolean credentialsNonExpired;

    /**
     * 授权信息(功能权限)
     */
    private Set<String> authorities;

    /**
     * 原始授权信息
     */
    private Object rawAuthInfo;

    /**
     * 创建一个认证对象
     *
     * @param tenantId 租户编号
     * @param account   账号
     * @param clientCode  客户端编码
     * @return {@link AuthUserRequest }
     */
    public static AuthUserRequest create(
            Long tenantId,
            String account,
            String clientCode) {
        AuthUserRequest authUser = new AuthUserRequest();
        authUser.setAccount(account);
        authUser.setClientCode(ObjectUtil.defaultIfBlank(clientCode,ApiConstant.D_C_CODE));
        authUser.setTenantId(ObjectUtil.defaultIfNull(tenantId,ApiConstant.D_T_ID));
        return authUser;
    }
}
